﻿// Copyright (c) 2010. Eric Nelson  
// https://code.google.com/p/prompts/
// All rights reserved.
//     
// Redistribution and use in source and binary forms,   
// with or without modification, are permitted provided   
// that the following conditions are met:    
// * Redistributions of source code must retain the   
// above copyright notice, this list of conditions and   
// the following disclaimer.    
// * Redistributions in binary form must reproduce   
// the above copyright notice, this list of conditions   
// and the following disclaimer in the documentation   
// and/or other materials provided with the distribution.    
// * Neither the name of Eric Nelson nor the   
// names of its contributors may be used to endorse   
// or promote products derived from this software   
// without specific prior written permission.    
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND   
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,   
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF   
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE   
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR   
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,   
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR   
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS   
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING   
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   
// SUCH DAMAGE.
// 
//     
// [This is the BSD license, see  
// http://www.opensource.org/licenses/bsd-license.php]  
using System;
using System.Windows.Controls;
using Prompts.Prompting.Views;
using Prompts.ReportRendering.Implementation;
using Prompts.ReportRendering.ViewModel;

namespace Prompts
{
    public static class PromptSystem
    {
        public static IReportRendererContainer ReportRendererContainer { get; set; }
        public static PromptContainer PromptContainer { get; set; }
        public static ReportCatalogContainer ReportCatalogContainer { get; set; }

        private static IReportRenderer _reportRenderer;

        private static UserControl _promptsControl;

        static PromptSystem()
        {
            ReportCatalogContainer = new ReportCatalogContainer();
            PromptContainer = new PromptContainer();
            ReportRendererContainer = new ReportRendererContainer();
        }

        public static object CreateReportRenderer()
        {
            if (_reportRenderer == null)
            {
                _reportRenderer = ReportRendererContainer.Create();
            }

            return _reportRenderer;
        }

        public static UserControl CreatePromptCollectionControl()
        {
            if (_promptsControl != null)
            {
                return _promptsControl;
            }

            CreateReportRendererIfItIsNull();
            PromptContainer.ReportRenderer = _reportRenderer;
            _promptsControl = PromptContainer.Create();
            return _promptsControl;
        }

        public static UserControl CreateReportCatalogControl()
        {
            if (_promptsControl == null)
            {
                _promptsControl = CreatePromptCollectionControl();
            }
            ReportCatalogContainer.PromptsViewModel = PromptContainer.PromptsViewModel;
            return ReportCatalogContainer.Create();
        }

        public static object CreatePopupView()
        {
            var popupReortViewModel = _reportRenderer as IPopupReportViewModel;

            if(popupReortViewModel == null)
            {
                throw new Exception(
                    "Unable to Create Popup View:  Report Renderer does not implement IPopupReportViewModel");
            }

            return new PopupReportView(popupReortViewModel);
        }

        public static PromptViewProvider CreatePromptViewProvider()
        {
            return PromptContainer.CreatePromptViewProvider();
        }

        public static PromptViewProvider CreatePromptTileViewProvider()
        {
            return PromptContainer.CreatePromptTileViewProvider();
        }

        private static void CreateReportRendererIfItIsNull()
        {
            if(_reportRenderer == null)
            {
                _reportRenderer = ReportRendererContainer.Create();
            }
        }

        public static IReportRenderer ReportRenderer
        {
            get
            {
                CreateReportRendererIfItIsNull();
                return _reportRenderer;
            }
        }
    }
}
